home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / Z80ppc 160.sit / Z80ppc 160 / CodesCB.c < prev    next >
Text File  |  1995-11-01  |  11KB  |  410 lines

  1. /*    Z80 Emulator: CB instruction handlers
  2.     Copyright (C) 1995 G.Woigk
  3.     
  4.     This file is part of Mac Spectacle and it is free software
  5.     See application.c for details
  6.             
  7.     This program is distributed in the hope that it will be useful,
  8.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  10.  
  11.     based on fMSX; Copyright (C) Marat Fayzullin 1994,1995
  12.  
  13.     Handler for CB prefixed instructions
  14.     All opcodes covered, no unsupported opcodes!
  15. */
  16.  
  17.  
  18. COUNT_CB_INSTR;            // profiler
  19. increment_r;            // prefixed instructions increment r by 2
  20. time(8);                // all register operations take 8 T cycles
  21.  
  22.  
  23. // =====================================================================
  24. // compact version which fit's in a 32k code segment (for 68020 version)
  25.  
  26. #if COMPACT_CODE
  27.  
  28. switch(peek(pc)&0x07)        // register; b,c,d,e,h,l,(hl),a
  29. {    
  30. case 0:    c=RB; break;
  31. case 1:    c=RC; break;
  32. case 2:    c=RD; break;
  33. case 3:    c=RE; break;
  34. case 4:    c=RH; break;
  35. case 5:    c=RL; break;
  36. case 6:    more(4);c=peek(HL); break;
  37. case 7:    c=ra; break;
  38. };
  39.  
  40. switch (peek(pc)>>3)        // instruction: shift/bit/res/set
  41. {
  42. case RLC_B>>3:    M_RLC(c);        break;        
  43. case RRC_B>>3:     M_RRC(c);        break;
  44. case RL_B>>3:    M_RL(c);        break;
  45. case RR_B>>3:    M_RR(c);        break;
  46. case SLA_B>>3:     M_SLA(c);        break;
  47. case SRA_B>>3:     M_SRA(c);        break;
  48. case SLL_B>>3:     M_SLL(c);
  49. #if INFO_ILLEGALS
  50.     switch(peek(pc++)&0x07)        // write back result & incr pc
  51.     {    
  52.     case 0:    RB=c; loop_ill2;
  53.     case 1:    RC=c; loop_ill2;
  54.     case 2:    RD=c; loop_ill2;
  55.     case 3:    RE=c; loop_ill2;
  56.     case 4:    RH=c; loop_ill2;
  57.     case 5:    RL=c; loop_ill2;
  58.     case 6:    more(3); rompoke(HL,c); loop_ill2;
  59.     case 7:    ra=c; loop_ill2;
  60.     };
  61. #else
  62.                                 break;
  63. #endif
  64. case SRL_B>>3:    M_SRL(c);        break;
  65. case BIT0_B>>3:    M_BIT(0x01,c);    pc++;    loop;
  66. case BIT1_B>>3:    M_BIT(0x02,c);    pc++;    loop;
  67. case BIT2_B>>3:    M_BIT(0x04,c);    pc++;    loop;
  68. case BIT3_B>>3:    M_BIT(0x08,c);    pc++;    loop;
  69. case BIT4_B>>3:    M_BIT(0x10,c);    pc++;    loop;
  70. case BIT5_B>>3:    M_BIT(0x20,c);    pc++;    loop;
  71. case BIT6_B>>3:    M_BIT(0x40,c);    pc++;    loop;
  72. case BIT7_B>>3:    M_BIT(0x80,c);    pc++;    loop;
  73. case RES0_B>>3:    c&=~0x01;        break;
  74. case RES1_B>>3:    c&=~0x02;        break;
  75. case RES2_B>>3:    c&=~0x04;        break;
  76. case RES3_B>>3:    c&=~0x08;        break;
  77. case RES4_B>>3:    c&=~0x10;        break;
  78. case RES5_B>>3:    c&=~0x20;        break;
  79. case RES6_B>>3:    c&=~0x40;        break;
  80. case RES7_B>>3:    c&=~0x80;        break;
  81. case SET0_B>>3:    c|=0x01;        break;
  82. case SET1_B>>3:    c|=0x02;        break;
  83. case SET2_B>>3:    c|=0x04;        break;
  84. case SET3_B>>3:    c|=0x08;        break;
  85. case SET4_B>>3:    c|=0x10;        break;
  86. case SET5_B>>3:    c|=0x20;        break;
  87. case SET6_B>>3:    c|=0x40;        break;
  88. case SET7_B>>3:    c|=0x80;        break;
  89. };
  90.  
  91. switch(peek(pc++)&0x07)        // write back result and increment pc
  92. {    
  93. case 0:    RB=c; loop;
  94. case 1:    RC=c; loop;
  95. case 2:    RD=c; loop;
  96. case 3:    RE=c; loop;
  97. case 4:    RH=c; loop;
  98. case 5:    RL=c; loop;
  99. case 6:    more(3); rompoke(HL,c); loop;
  100. case 7:    ra=c; loop;
  101. };
  102.  
  103.  
  104.  
  105. // ==== FAST VERSION ===============================================
  106. #else
  107.  
  108.  
  109. switch(n)
  110. {
  111. case RLC_B:    M_RLC(RB);loop;        
  112. case RLC_C: M_RLC(RC);loop;
  113. case RLC_D:    M_RLC(RD);loop;        
  114. case RLC_E: M_RLC(RE);loop;
  115. case RLC_H: M_RLC(RH);loop;        
  116. case RLC_L: M_RLC(RL);loop;
  117. case RLC_X: more(7);c=peek(HL);M_RLC(c);rompoke(HL,c);loop;
  118. case RLC_A: M_RLC(ra);loop;
  119.  
  120. case RRC_B: M_RRC(RB);loop;
  121. case RRC_C: M_RRC(RC);loop;
  122. case RRC_D: M_RRC(RD);loop;
  123. case RRC_E: M_RRC(RE);loop;
  124. case RRC_H: M_RRC(RH);loop;
  125. case RRC_L: M_RRC(RL);loop;
  126. case RRC_X:    more(7);c=peek(HL);M_RRC(c);rompoke(HL,c);loop;
  127. case RRC_A: M_RRC(ra);loop;
  128.  
  129. case RL_B:    M_RL(RB);loop;
  130. case RL_C:    M_RL(RC);loop;
  131. case RL_D:    M_RL(RD);loop;
  132. case RL_E:    M_RL(RE);loop;
  133. case RL_H:    M_RL(RH);loop;
  134. case RL_L:    M_RL(RL);loop;
  135. case RL_X:    more(7);c=peek(HL);M_RL(c);rompoke(HL,c);loop;
  136. case RL_A:    M_RL(ra);loop;
  137.  
  138. case RR_B:    M_RR(RB);loop;
  139. case RR_C:    M_RR(RC);loop;
  140. case RR_D:    M_RR(RD);loop;
  141. case RR_E:    M_RR(RE);loop;
  142. case RR_H:    M_RR(RH);loop;
  143. case RR_L:    M_RR(RL);loop;
  144. case RR_X:    more(7);c=peek(HL);M_RR(c);rompoke(HL,c);loop;
  145. case RR_A:    M_RR(ra);loop;
  146.  
  147. case SLA_B: M_SLA(RB);loop;
  148. case SLA_C: M_SLA(RC);loop;
  149. case SLA_D: M_SLA(RD);loop;
  150. case SLA_E: M_SLA(RE);loop;
  151. case SLA_H: M_SLA(RH);loop;
  152. case SLA_L: M_SLA(RL);loop;
  153. case SLA_X: more(7);c=peek(HL);M_SLA(c);rompoke(HL,c);loop;
  154. case SLA_A: M_SLA(ra);loop;
  155.  
  156. case SRA_B: M_SRA(RB);loop;
  157. case SRA_C: M_SRA(RC);loop;
  158. case SRA_D: M_SRA(RD);loop;
  159. case SRA_E: M_SRA(RE);loop;
  160. case SRA_H: M_SRA(RH);loop;
  161. case SRA_L: M_SRA(RL);loop;
  162. case SRA_X: more(7);c=peek(HL);M_SRA(c);rompoke(HL,c);loop;
  163. case SRA_A: M_SRA(ra);loop;
  164.  
  165. case SLL_B: M_SLL(RB);loop_ill2;
  166. case SLL_C: M_SLL(RC);loop_ill2;
  167. case SLL_D: M_SLL(RD);loop_ill2;
  168. case SLL_E: M_SLL(RE);loop_ill2;
  169. case SLL_H: M_SLL(RH);loop_ill2;
  170. case SLL_L: M_SLL(RL);loop_ill2;
  171. case SLL_X: more(7);c=peek(HL);M_SLL(c);rompoke(HL,c);loop_ill2;
  172. case SLL_A: M_SLL(ra);loop_ill2;
  173.  
  174. case SRL_B: M_SRL(RB);loop;
  175. case SRL_C: M_SRL(RC);loop;
  176. case SRL_D: M_SRL(RD);loop;
  177. case SRL_E: M_SRL(RE);loop;
  178. case SRL_H: M_SRL(RH);loop;
  179. case SRL_L: M_SRL(RL);loop;
  180. case SRL_X: more(7);c=peek(HL);M_SRL(c);rompoke(HL,c);loop;
  181. case SRL_A: M_SRL(ra);loop;
  182.     
  183.  
  184. case BIT0_B:    M_BIT(0x01,RB);loop;
  185. case BIT0_C:    M_BIT(0x01,RC);loop;
  186. case BIT0_D:    M_BIT(0x01,RD);loop;
  187. case BIT0_E:    M_BIT(0x01,RE);loop;
  188. case BIT0_H:    M_BIT(0x01,RH);loop;
  189. case BIT0_L:    M_BIT(0x01,RL);loop;
  190. case BIT0_X:    more(4);c=peek(HL);M_BIT(0x01,c);loop;
  191. case BIT0_A:    M_BIT(0x01,ra);loop;
  192.  
  193. case BIT1_B:    M_BIT(0x02,RB);loop;
  194. case BIT1_C:    M_BIT(0x02,RC);loop;
  195. case BIT1_D:    M_BIT(0x02,RD);loop;
  196. case BIT1_E:    M_BIT(0x02,RE);loop;
  197. case BIT1_H:    M_BIT(0x02,RH);loop;
  198. case BIT1_L:    M_BIT(0x02,RL);loop;
  199. case BIT1_X:    more(4);c=peek(HL);M_BIT(0x02,c);loop;
  200. case BIT1_A:    M_BIT(0x02,ra);loop;
  201.  
  202. case BIT2_B:    M_BIT(0x04,RB);loop;
  203. case BIT2_C:    M_BIT(0x04,RC);loop;
  204. case BIT2_D:    M_BIT(0x04,RD);loop;
  205. case BIT2_E:    M_BIT(0x04,RE);loop;
  206. case BIT2_H:    M_BIT(0x04,RH);loop;
  207. case BIT2_L:    M_BIT(0x04,RL);loop;
  208. case BIT2_X:    more(4);c=peek(HL);M_BIT(0x04,c);loop;
  209. case BIT2_A:    M_BIT(0x04,ra);loop;
  210.  
  211. case BIT3_B:    M_BIT(0x08,RB);loop;
  212. case BIT3_C:    M_BIT(0x08,RC);loop;
  213. case BIT3_D:    M_BIT(0x08,RD);loop;
  214. case BIT3_E:    M_BIT(0x08,RE);loop;
  215. case BIT3_H:    M_BIT(0x08,RH);loop;
  216. case BIT3_L:    M_BIT(0x08,RL);loop;
  217. case BIT3_X:    more(4);c=peek(HL);M_BIT(0x08,c);loop;
  218. case BIT3_A:    M_BIT(0x08,ra);loop;
  219.  
  220. case BIT4_B:    M_BIT(0x10,RB);loop;
  221. case BIT4_C:    M_BIT(0x10,RC);loop;
  222. case BIT4_D:    M_BIT(0x10,RD);loop;
  223. case BIT4_E:    M_BIT(0x10,RE);loop;
  224. case BIT4_H:    M_BIT(0x10,RH);loop;
  225. case BIT4_L:    M_BIT(0x10,RL);loop;
  226. case BIT4_X:    more(4);c=peek(HL);M_BIT(0x10,c);loop;
  227. case BIT4_A:    M_BIT(0x10,ra);loop;
  228.  
  229. case BIT5_B:    M_BIT(0x20,RB);loop;
  230. case BIT5_C:    M_BIT(0x20,RC);loop;
  231. case BIT5_D:    M_BIT(0x20,RD);loop;
  232. case BIT5_E:    M_BIT(0x20,RE);loop;
  233. case BIT5_H:    M_BIT(0x20,RH);loop;
  234. case BIT5_L:    M_BIT(0x20,RL);loop;
  235. case BIT5_X:    more(4);c=peek(HL);M_BIT(0x20,c);loop;
  236. case BIT5_A:    M_BIT(0x20,ra);loop;
  237.  
  238. case BIT6_B:    M_BIT(0x40,RB);loop;
  239. case BIT6_C:    M_BIT(0x40,RC);loop;
  240. case BIT6_D:    M_BIT(0x40,RD);loop;
  241. case BIT6_E:    M_BIT(0x40,RE);loop;
  242. case BIT6_H:    M_BIT(0x40,RH);loop;
  243. case BIT6_L:    M_BIT(0x40,RL);loop;
  244. case BIT6_X:    more(4);c=peek(HL);M_BIT(0x40,c);loop;
  245. case BIT6_A:    M_BIT(0x40,ra);loop;
  246.  
  247. case BIT7_B:    M_BIT(0x80,RB);loop;
  248. case BIT7_C:    M_BIT(0x80,RC);loop;
  249. case BIT7_D:    M_BIT(0x80,RD);loop;
  250. case BIT7_E:    M_BIT(0x80,RE);loop;
  251. case BIT7_H:    M_BIT(0x80,RH);loop;
  252. case BIT7_L:    M_BIT(0x80,RL);loop;
  253. case BIT7_X:    more(4);c=peek(HL);M_BIT(0x80,c);loop;
  254. case BIT7_A:    M_BIT(0x80,ra);loop;
  255.  
  256.  
  257. case RES0_B:    RB&=~0x01;loop;
  258. case RES0_C:    RC&=~0x01;loop;
  259. case RES0_D:    RD&=~0x01;loop;
  260. case RES0_E:    RE&=~0x01;loop;
  261. case RES0_H:    RH&=~0x01;loop;
  262. case RES0_L:    RL&=~0x01;loop;
  263. case RES0_X:    more(7);rompoke(HL,peek(HL)&~0x01);loop;
  264. case RES0_A:    ra&=~0x01;loop;
  265.  
  266. case RES1_B:    RB&=~0x02;loop;
  267. case RES1_C:    RC&=~0x02;loop;
  268. case RES1_D:    RD&=~0x02;loop;
  269. case RES1_E:    RE&=~0x02;loop;
  270. case RES1_H:    RH&=~0x02;loop;
  271. case RES1_L:    RL&=~0x02;loop;
  272. case RES1_X:    more(7);rompoke(HL,peek(HL)&~0x02);loop;
  273. case RES1_A:    ra&=~0x02;loop;
  274.  
  275. case RES2_B:    RB&=~0x04;loop;
  276. case RES2_C:    RC&=~0x04;loop;
  277. case RES2_D:    RD&=~0x04;loop;
  278. case RES2_E:    RE&=~0x04;loop;
  279. case RES2_H:    RH&=~0x04;loop;
  280. case RES2_L:    RL&=~0x04;loop;
  281. case RES2_X:    more(7);rompoke(HL,peek(HL)&~0x04);loop;
  282. case RES2_A:    ra&=~0x04;loop;
  283.  
  284. case RES3_B:    RB&=~0x08;loop;
  285. case RES3_C:    RC&=~0x08;loop;
  286. case RES3_D:    RD&=~0x08;loop;
  287. case RES3_E:    RE&=~0x08;loop;
  288. case RES3_H:    RH&=~0x08;loop;
  289. case RES3_L:    RL&=~0x08;loop;
  290. case RES3_X:    more(7);rompoke(HL,peek(HL)&~0x08);loop;
  291. case RES3_A:    ra&=~0x08;loop;
  292.  
  293. case RES4_B:    RB&=~0x10;loop;
  294. case RES4_C:    RC&=~0x10;loop;
  295. case RES4_D:    RD&=~0x10;loop;
  296. case RES4_E:    RE&=~0x10;loop;
  297. case RES4_H:    RH&=~0x10;loop;
  298. case RES4_L:    RL&=~0x10;loop;
  299. case RES4_X:    more(7);rompoke(HL,peek(HL)&~0x10);loop;
  300. case RES4_A:    ra&=~0x10;loop;
  301.  
  302. case RES5_B:    RB&=~0x20;loop;
  303. case RES5_C:    RC&=~0x20;loop;
  304. case RES5_D:    RD&=~0x20;loop;
  305. case RES5_E:    RE&=~0x20;loop;
  306. case RES5_H:    RH&=~0x20;loop;
  307. case RES5_L:    RL&=~0x20;loop;
  308. case RES5_X:    more(7);rompoke(HL,peek(HL)&~0x20);loop;
  309. case RES5_A:    ra&=~0x20;loop;
  310.  
  311. case RES6_B:    RB&=~0x40;loop;
  312. case RES6_C:    RC&=~0x40;loop;
  313. case RES6_D:    RD&=~0x40;loop;
  314. case RES6_E:    RE&=~0x40;loop;
  315. case RES6_H:    RH&=~0x40;loop;
  316. case RES6_L:    RL&=~0x40;loop;
  317. case RES6_X:    more(7);rompoke(HL,peek(HL)&~0x40);loop;
  318. case RES6_A:    ra&=~0x40;loop;
  319.  
  320. case RES7_B:    RB&=~0x80;loop;
  321. case RES7_C:    RC&=~0x80;loop;
  322. case RES7_D:    RD&=~0x80;loop;
  323. case RES7_E:    RE&=~0x80;loop;
  324. case RES7_H:    RH&=~0x80;loop;
  325. case RES7_L:    RL&=~0x80;loop;
  326. case RES7_X:    more(7);rompoke(HL,peek(HL)&~0x80);loop;
  327. case RES7_A:    ra&=~0x80;loop;
  328.  
  329.  
  330. case SET0_B:    RB|=0x01;loop;
  331. case SET0_C:    RC|=0x01;loop;
  332. case SET0_D:    RD|=0x01;loop;
  333. case SET0_E:    RE|=0x01;loop;
  334. case SET0_H:    RH|=0x01;loop;
  335. case SET0_L:    RL|=0x01;loop;
  336. case SET0_X:    more(7);rompoke(HL,peek(HL)|0x01);loop;
  337. case SET0_A:    ra|=0x01;loop;
  338.  
  339. case SET1_B:    RB|=0x02;loop;
  340. case SET1_C:    RC|=0x02;loop;
  341. case SET1_D:    RD|=0x02;loop;
  342. case SET1_E:    RE|=0x02;loop;
  343. case SET1_H:    RH|=0x02;loop;
  344. case SET1_L:    RL|=0x02;loop;
  345. case SET1_X:    more(7);rompoke(HL,peek(HL)|0x02);loop;
  346. case SET1_A:    ra|=0x02;loop;
  347.  
  348. case SET2_B:    RB|=0x04;loop;
  349. case SET2_C:    RC|=0x04;loop;
  350. case SET2_D:    RD|=0x04;loop;
  351. case SET2_E:    RE|=0x04;loop;
  352. case SET2_H:    RH|=0x04;loop;
  353. case SET2_L:    RL|=0x04;loop;
  354. case SET2_X:    more(7);rompoke(HL,peek(HL)|0x04);loop;
  355. case SET2_A:    ra|=0x04;loop;
  356.  
  357. case SET3_B:    RB|=0x08;loop;
  358. case SET3_C:    RC|=0x08;loop;
  359. case SET3_D:    RD|=0x08;loop;
  360. case SET3_E:    RE|=0x08;loop;
  361. case SET3_H:    RH|=0x08;loop;
  362. case SET3_L:    RL|=0x08;loop;
  363. case SET3_X:    more(7);rompoke(HL,peek(HL)|0x08);loop;
  364. case SET3_A:    ra|=0x08;loop;
  365.  
  366. case SET4_B:    RB|=0x10;loop;
  367. case SET4_C:    RC|=0x10;loop;
  368. case SET4_D:    RD|=0x10;loop;
  369. case SET4_E:    RE|=0x10;loop;
  370. case SET4_H:    RH|=0x10;loop;
  371. case SET4_L:    RL|=0x10;loop;
  372. case SET4_X:    more(7);rompoke(HL,peek(HL)|0x10);loop;
  373. case SET4_A:    ra|=0x10;loop;
  374.  
  375. case SET5_B:    RB|=0x20;loop;
  376. case SET5_C:    RC|=0x20;loop;
  377. case SET5_D:    RD|=0x20;loop;
  378. case SET5_E:    RE|=0x20;loop;
  379. case SET5_H:    RH|=0x20;loop;
  380. case SET5_L:    RL|=0x20;loop;
  381. case SET5_X:    more(7);rompoke(HL,peek(HL)|0x20);loop;
  382. case SET5_A:    ra|=0x20;loop;
  383.  
  384. case SET6_B:    RB|=0x40;loop;
  385. case SET6_C:    RC|=0x40;loop;
  386. case SET6_D:    RD|=0x40;loop;
  387. case SET6_E:    RE|=0x40;loop;
  388. case SET6_H:    RH|=0x40;loop;
  389. case SET6_L:    RL|=0x40;loop;
  390. case SET6_X:    more(7);rompoke(HL,peek(HL)|0x40);loop;
  391. case SET6_A:    ra|=0x40;loop;
  392.  
  393. case SET7_B:    RB|=0x80;loop;
  394. case SET7_C:    RC|=0x80;loop;
  395. case SET7_D:    RD|=0x80;loop;
  396. case SET7_E:    RE|=0x80;loop;
  397. case SET7_H:    RH|=0x80;loop;
  398. case SET7_L:    RL|=0x80;loop;
  399. case SET7_X:    more(7);rompoke(HL,peek(HL)|0x80);loop;
  400. case SET7_A:    ra|=0x80;loop;
  401.  
  402. };
  403. loop;    // never used
  404.  
  405.  
  406. #endif
  407.  
  408.  
  409.  
  410.